package com.ysp.summary.listener;


import com.ysp.summary.entity.TestPublisherEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

/**
 * 使用注解监听spring的广播事件 注意事件的延续 如果原来的回滚了 监听的逻辑执行了 这就很尴尬了 好在监听器是支持事务的：
 * @TransactionalEventListener(phase 阶段)
 * 1、AFTER_COMMIT(默认值)，用于在事务成功完成后触发事件
 * 2、AFTER_ROLLBACK，用于事务回滚时触发事件
 * 3、AFTER_COMPLETION,用于事务完成后触发事件（AFTER_COMMIT和AFTER_ROLLBACK的一种模糊表述）
 * 4、BEFORE_COMMIT,用于事务提交前触发事件
 *
 * @author Administrator
 */
@Component
public class SpringEventListener {

    @EventListener(condition = "#event.id >3")    // 满足condition时 才执行具体的逻辑
//    @Async  // 采用spring自己的线程池 异步执行任务
//    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT,condition = "#event.id >3")
    public void testEventListener(TestPublisherEvent event){
        switch (event.getType()){
            case 1:
                System.out.println("用户注册: id="+event.getId()+",事件编号："+event.getEventNo());
                System.out.println("监听到事件以后，执行业务的线程是哪一个： "+Thread.currentThread().getName());
                break;
            case 2:
                System.out.println("下了个订单: id="+event.getId()+",事件编号："+event.getEventNo());
                System.out.println("监听到事件以后，执行业务的线程是哪一个： "+Thread.currentThread().getName());
                break;
            case 3:
                System.out.println("要加减积分了: id="+event.getId()+",事件编号："+event.getEventNo());
                System.out.println("监听到事件以后，执行业务的线程是哪一个： "+Thread.currentThread().getName());
                break;
            case 4:
                System.out.println("还没定义好的事件: id="+event.getId()+",事件编号："+event.getEventNo());
                System.out.println("监听到事件以后，执行业务的线程是哪一个： "+Thread.currentThread().getName());
                break;
            default:
                System.out.println("不知道啥事件: id="+event.getId()+",事件编号："+event.getEventNo());
                System.out.println("监听到事件以后，执行业务的线程是哪一个： "+Thread.currentThread().getName());
                break;
        }
    }
}
